#ifndef HEAD_H
#define HEAD_H

#include <my_header.h>
#include <openssl/md5.h>
#include <crypt.h>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <termios.h>


#define IPNUM 3

// 数据结构：TLV私有协议字段
typedef struct train_s{
    int type;
    int len;
    char buf[4096];
}train_t;

typedef struct downloadInfo_s{
    char ip[1024];
    char port[256];
    char fileName[1024];
    char clientPath[1024];
    int begin;
    int getsSize;
    int fileSumSize;
    char progressFileName[1024];
}downloadInfo_t;

// 枚举：用于填充火车的type字段
enum{
    CD,
    LS,
    PUTS,
    GETS,
    PWD ,
    MKDIR,
    RMDIR,
    RMDIR_R,
    REMOVE,
    FILE_LEN,
    SEND_FILE,
    CANCEL,
    IS_OK,
    IS_NOT_OK,
    SIGNUP_USERNAME,
    SIGNUP_SALT,
    SIGNUP_CRYPTED,
    LOGIN_USERNAME,
    LOGIN_SALT,
    LOGIN_CRYPTED,
    NEW_CLIENT,
    IPADDR_PORT
};

// 指令集
static const int instructCount = 8;
static const char instructSet[][10] = {"cd", "pwd", "ls", "mkdir", "rmdir", "puts", "gets", "remove"};

// 功能：与服务端建立连接
int establishConnect(char *ip, char *port);

// 功能：接收服务端发来的响应
int TLVRecvResponse(int sockfd, train_t *train_t);

// 功能：给服务发送请求
int TLVRequest(int sockfd, const char *mess, int type);

// 功能：传送文件时，发送长度
int TLVRequestLen(int sockfd, int len);

// 功能：登录验证
// 返回值：
//      0：登录成功
//      非0：登录失败
int loginVerity(int sockfd);

// 功能：注册
// 返回值：
//      0：注册成功
//      非0：失败
int registerVerity(int sockfd);


// 功能：指令处理
int dealInstruction(char *instrcution, int sockfd);


// 功能：上传
int putsFile(int sockfd, char* serverPath, char* clientPath);

// 功能：下载
int getsFile(int sockfd, char* clientPath, char* serverPath);


#endif
